package org.dromara.community.controller;

import io.swagger.v3.oas.annotations.Operation;
import org.dromara.comm_lhz.util.QiniuUtil;
import org.dromara.community.entity.AsCommunityAnnouncements;
import org.dromara.community.entity.AsPartyBuilding;
import org.dromara.community.entity.dto.AsCommunityAnnouncementsDTO;
import org.dromara.community.entity.dto.AsPartyBuildingDTO;
import org.dromara.community.mapper.AsPartyBuildingMapper;
import org.dromara.community.service.AsPartyBuildingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/partyBuilding")
public class AsPartyBuildingController {

    @Autowired
    private AsPartyBuildingService asPartyBuildingService;

    @Autowired
    private QiniuUtil qiniuUtil;

    @Autowired
    private AsPartyBuildingMapper asPartyBuildingMapper;


    /**
     * 上传图片并新增党建党建。
     * 该接口用于接收用户上传的图片和相关党建信息，将图片上传至七牛云存储，并在数据库中新增一条党建记录。
     *
     * @param file        上传的图片文件。
     * @param category    党建分类。
     * @param subcategory 党建子分类。
     * @param title       党建标题。
     * @param description 党建描述。
     * @param tag         党建标签，可选参数。
     * @return 返回一个包含消息和图片URL的响应体，成功时消息为"党建已成功创建"，失败时包含错误消息。
     */
    @Operation(summary = "上传图片并新增党建")
    @PostMapping("/uploadAsPartyAdd")
    public ResponseEntity<Map<String, Object>> uploadImageAsPartyBuilding(
        @RequestParam(value = "file") MultipartFile file,
        @RequestParam(value = "category") String category,
        @RequestParam(value = "subcategory") String subcategory,
        @RequestParam(value = "title") String title,
        @RequestParam(value = "description") String description,
        @RequestParam(value = "tag", required = false) String tag) {

        Map<String, Object> response = new HashMap<>();
        try {
            if (file.isEmpty()) {
                response.put("message", "文件不能为空");
                return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
            }
            System.out.println("File received: " + file.getOriginalFilename());

            String imageUrl = qiniuUtil.uploadImage(file);

            AsPartyBuildingDTO asPartyBuildingDTO = new AsPartyBuildingDTO();
            asPartyBuildingDTO.setCategory(category);
            asPartyBuildingDTO.setSubcategory(subcategory);
            asPartyBuildingDTO.setTitle(title);
            asPartyBuildingDTO.setDescription(description);
            asPartyBuildingDTO.setTag(tag);
            asPartyBuildingDTO.setUrl(imageUrl);
            asPartyBuildingDTO.setIsDelete(0L);

            asPartyBuildingService.save(asPartyBuildingDTO);

            response.put("message", "党建已成功创建");
            response.put("imageUrl", imageUrl);
            return new ResponseEntity<>(response, HttpStatus.OK);

        } catch (Exception e) {
            response.put("message", "发生错误：" + e.getMessage());
            return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

    /*    */

    /**
     * 上传图片并更新党建信息。
     *
     * @param file        上传的图片文件，非必需。
     * @param id          党建ID，必需，用于定位要更新的党建。
     * @param category    党建分类，非必需，用于更新党建的分类。
     * @param subcategory 党建子分类，非必需，用于更新党建的子分类。
     * @param title       党建标题，非必需，用于更新党建的标题。
     * @param description 党建描述，非必需，用于更新党建的描述。
     * @param tag         党建标签，非必需，用于更新党建的标签。
     * @return 返回一个包含更新结果和图片URL的Map对象。
     */
    @Operation(summary = "上传图片并修改党建")
    @PostMapping("/uploadAsParty")
    public ResponseEntity<Map<String, Object>> uploadImageAsParty(
        @RequestParam(value = "file", required = false) MultipartFile file,
        @RequestParam(value = "id") Long id,
        @RequestParam(value = "category", required = false) String category,
        @RequestParam(value = "subcategory", required = false) String subcategory,
        @RequestParam(value = "title", required = false) String title,
        @RequestParam(value = "description", required = false) String description,
        @RequestParam(value = "tag", required = false) String tag) {

        Map<String, Object> response = new HashMap<>();

        try {
            // 根据ID查找党建，确认党建存在。
            AsPartyBuilding asPartyBuilding = asPartyBuildingMapper.selectById(id);
            if (asPartyBuilding == null) {
                response.put("message", "党建未找到");
                return new ResponseEntity<>(response, HttpStatus.NOT_FOUND);
            }

            // 如果上传了图片，进行图片上传并更新党建的图片URL。
            String imageUrl = null;
            if (file != null && !file.isEmpty()) {
                imageUrl = qiniuUtil.uploadImage(file);
                asPartyBuilding.setUrl(imageUrl);  // 更新图片 URL
            }

            // 更新党建的其他信息。
            if (category != null) asPartyBuilding.setCategory(category);
            if (subcategory != null) asPartyBuilding.setSubcategory(subcategory);
            if (title != null) asPartyBuilding.setTitle(title);
            if (description != null) asPartyBuilding.setDescription(description);
            if (tag != null) asPartyBuilding.setTag(tag);

            asPartyBuilding.setIsDelete(0L);  // 保持默认值（如果需要）

            // 保存更新后的党建信息。确保使用更新方法而不是插入方法。
            asPartyBuildingMapper.updateById(asPartyBuilding);

            // 组装并返回更新成功的响应信息，包括图片URL。
            response.put("message", "党建已成功更新");
            response.put("imageUrl", imageUrl);
            return new ResponseEntity<>(response, HttpStatus.OK);

        } catch (Exception e) {
            response.put("message", "发生错误：" + e.getMessage());
            return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

    /**
     * 通过GET请求选择作为社区党建的方法。
     * <p>
     * 本方法旨在查询并返回所有社区党建，供用户或管理员查看当前有效的党建信息。
     * 不接受任何参数，返回一个包含党建列表和状态信息的Map对象。
     *
     * @return ResponseEntity<Map < String, Object>> - 包含党建列表和状态的响应实体。
     * 响应中的"status"表示操作状态，"data"包含党建数据。
     */
    @GetMapping("/selectAsParty")
    public ResponseEntity<Map<String, Object>> SelectAsParty() {
        // 调用Mapper查询所有社区党建
        // 调用查询所有党建的方法
        List<AsPartyBuilding> asPartyBuildings = asPartyBuildingMapper.selectList(null);

        // 构建响应Map，包含查询结果和操作状态
        // 创建响应数据
        Map<String, Object> response = new HashMap<>();
        response.put("status", "success");
        response.put("data", asPartyBuildings);

        // 返回包含党建数据和状态信息的响应实体
        // 返回响应
        return ResponseEntity.ok(response);
    }

    /**
     * 根据标题模糊查询社区党建信息。
     *
     * @param title 党建标题，可选参数，用于模糊查询。
     * @return ResponseEntity 包含查询结果和状态信息。
     * Map<String, Object> 中的 "status" 表示查询状态，"data" 表示查询结果。
     * @GetMapping 注解指明该方法处理GET请求，并指定请求的URL。
     * @RequestParam 注解用于绑定请求参数，value属性指定参数名，required属性指定参数是否必须。
     */
    @GetMapping("/selectAsPartyName")
    public ResponseEntity<Map<String, Object>> SelectAsCommunityByTitle(@RequestParam(value = "title", required = false) String title) {
        // 调用服务层方法，根据标题查询社区党建信息
        // 调用服务层方法进行模糊查询
        List<AsCommunityAnnouncementsDTO> asCommunityAnnouncementsDTOS = asPartyBuildingService.selectAsParty(title);

        // 构建响应数据，包含查询状态和查询结果
        // 创建响应数据
        Map<String, Object> response = new HashMap<>();
        response.put("status", "success");
        response.put("data", asCommunityAnnouncementsDTOS);

        // 返回响应结果
        // 返回响应
        return ResponseEntity.ok(response);
    }


    /**
     * 作为社区管理员删除党建。
     *
     * @param id 党建的ID，用于指定要删除的党建。
     * @return ResponseEntity包含操作结果的映射，其中"status"表示操作状态，"message"表示操作信息。
     */
    @GetMapping("/deleteAsParty")
    public ResponseEntity<Map<String, Object>> deleteAsCommunity(@RequestParam(value = "id") Long id) {
        // 初始化响应映射，用于存放操作结果
        Map<String, Object> response = new HashMap<>();

        try {
            // 调用服务层方法尝试删除指定ID的党建
            // 调用服务层方法删除党建
            boolean isDeleted = asPartyBuildingService.removeById(id);

            // 根据删除操作的结果设置响应信息
            if (isDeleted) {
                response.put("status", "success");
                response.put("message", "已成功删除党建。");
            } else {
                response.put("status", "failure");
                response.put("message", "未找到或无法删除党建。");
            }
        } catch (Exception e) {
            // 捕获任何异常，设置响应状态为错误，并提供通用的错误信息
            response.put("status", "error");
            response.put("message", "删除党建时出错。");
        }
        // 返回响应对象，包含操作结果的映射
        // 返回响应
        return ResponseEntity.ok(response);
    }

    /**
     * 根据图片ID获取公告信息
     * <p>
     * 此方法通过接收一个图片ID作为参数，调用服务层的方法来查询与该图片ID相关的公告信息
     * 它使用了@GetMapping注解，表明此方法用于处理对指定URL的GET请求，URL路径中包含图片ID
     *
     * @param imageId 图片的ID，作为查询条件，用于筛选与之相关的公告
     * @return 返回一个AsPartyBuildingDTO类型的列表，包含了与指定图片ID相关的公告信息
     */
    @GetMapping("/announcementByImageId")
    public List<AsPartyBuildingDTO> getAnnouncementByImageId(@RequestParam Integer imageId) {
        return asPartyBuildingService.selectAnnouncementByImageId(imageId);

    }

}
